home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_10_01
/
1001069a
< prev
next >
Wrap
Text File
|
1991-11-24
|
5KB
|
203 lines
/****************************************************/
/* */
/* Musical Instrument Digital Interface OS/2 */
/* Device Driver, primarily written in Microsoft */
/* C (tm). */
/* */
/* Copyright IBM 1991. */
/* */
/* */
/****************************************************/
#include "midic.h"
/***************************************************/
/* */
/* Device Header must be the FIRST data area */
/* */
/***************************************************/
DeviceHeader devhdr = {
(void far *) -1,
(DAW_CHR | DAW_OPN | DAW_LEVEL),
(void near *) STRAT,
(void near *) 0,
{'M','I','D','I','$',' ',' ',' '},
{0}
};
/****************************************************/
/* */
/* These next variables must be initialized all to */
/* zero. Also, the MsgData is used not only to */
/* display the Device Driver message during the */
/* boot process, but is also used to write the end */
/* of data offset into the Request Header. */
/* */
/****************************************************/
unsigned far *DevHlp=0L;/* Storage area for DevHlps */
unsigned char rx_queue[10]={0}; /* receiver queue */
unsigned char tx_queue[10]={0}; /* transmitter queue*/
InitExit far *InitExt=0L; /* pointer to InitExit */
DeviceRead far *DevRead=0L; /* points to read strc */
DeviceWrite far *DevWrite=0L;/* points to write str */
unsigned char MsgData[] = "Midi Device Driver \r\n";
/*********************************/
/* */
/* Device Initialization Routine */
/* is called only once during */
/* the OS/2 BOOT process. The */
/* address of the DevHlp */
/* */
/*********************************/
void Init(InitEntry far *InitPtr, int dev)
{
DevHlp = (unsigned far *)InitPtr->DevHlp;
/* callable DevHlp */
/* entry point.. */
/*********************************/
/* */
/* During Initialization we can */
/* install the interrupt handler */
/* which will allow OS/2 to know */
/* where the code is that will */
/* run, each time the interrupt */
/* 9 happens. */
/* */
/*********************************/
DOSPUTMESSAGE(1, 8, devhdr.name);
DOSPUTMESSAGE(1,strlen(MsgData),MsgData);
SetIRQ(9,(void near *)INT_HNDLR,0);
/* output initialization message */
/* send back our cs and ds end values to os/2 */
InitExt = (InitExit far *)InitPtr;
InitExt->code_off = (unsigned short)last_code;
InitExt->data_off = (unsigned short)MsgData+
strlen(MsgData);
return;
}
/* common entry point for calls to strat routines */
void main(ReqHeader far *rp, int dev )
{
switch(rp->req_cmd)
{
case INIT:
Init((InitEntry far *)rp,dev);
rp->req_stat = DONE;
return;
case OPEN:
/****************************/
/* */
/* During OPEN, place MPU */
/* into "DUMB" mode. */
/* */
/****************************/
outp(MIDI_CMD,DUMB_MODE);
rp->req_stat = DONE;
return;
case CLOSE:
/****************************/
/* */
/* During CLOSE, reset MPU */
/* mode. */
/* */
/****************************/
outp(MIDI_CMD,MPU_RESET);
rp->req_stat = DONE;
return;
case READ:
rx_queue[0] = inp(MIDI_DATA);
DevRead = (DeviceRead far *)rp;
ReadBytes((unsigned long)DevRead->buff_addr,
(unsigned long)rx_queue,
1);
rp->req_stat = DONE;
return;
case WRITE:
DevWrite = (DeviceWrite far *)rp;
WriteBytes((unsigned long)DevWrite->buff_addr,
(unsigned long)tx_queue,
1);
rp->req_stat = DONE;
return;
case IOCTL:
rp->req_stat = DONE;
return;
default:
rp->req_stat = DONE;
return;
}
}
/***************************/
/* */
/* This interrupt handler */
/* is called by _INT_HNDLR */
/* from the assembler pro- */
/* cedure. After return- */
/* ing, the DevHlp End of */
/* Interrupt function. */
/* */
/***************************/
void near interrupt_handler ()
{
rx_queue[0] = inp(0x0330);
}
/**************************/
/* */
/* Last code offset.... */
/* */
/**************************/
void last_code() {}